#include <iostream>
#include <vector>
#include <unordered_set>

using namespace std;

bool isValidSudoku(vector<vector<char>>& board)
{
	unordered_set<char> co;
	for (int x = 0; x < 9; x++)
	{
		co.clear();
		for (int y = 0; y < 9; y++)
		{
			char value = board[y][x];
			if (value != '.')
			{
				if (!co.insert(value).second)
				{
					return false;
				}
			}
		}
	}
	for (int y = 0; y < 9; y++)
	{
		co.clear();
		for (int x = 0; x < 9; x++)
		{
			char value = board[y][x];
			if (value != '.')
			{
				if (!co.insert(value).second)
				{
					return false;
				}
			}
		}
	}

	for (int i = 0; i < 3; i++)
	{
		for (int j = 0; j < 3; j++)
		{
			int xoffset = i * 3;
			int yoffset = j * 3;
			co.clear();
			for (int x = 0; x < 3; x++)
			{
				for (int y = 0; y < 3; y++)
				{
					char value = board[yoffset + y][xoffset + x];
					if (value != '.')
					{
						if (!co.insert(value).second)
						{
							return false;
						}
					}
				}
			}
		}
	}
	return true;
}

int main()
{
	vector<vector<char>> board;
	for (int i = 0; i < 9; i++)
	{
		board.push_back(vector<char>{'.', '.', '.', '.', '.', '.', '.', '.', '.', });
	}
	cout << isValidSudoku(board) << endl;
	return 0;
}

